package com.sky.state;

/**
 * @author : wushikai
 * <p>
 * date : 2020-08-21
 */

/**
 * 状态模式的架构
 * <p>
 * 状态模式包含以下主要角色。
 * 环境（Context）角色：也称为上下文，它定义了客户感兴趣的接口，维护一个当前状态，并将与状态相关的操作委托给当前状态对象来处理。
 * 抽象状态（State）角色：定义一个接口，用以封装环境对象中的特定状态所对应的行为。
 * 具体状态（Concrete    State）角色：实现抽象状态所对应的行为。
 */

public abstract class State {

    public abstract void handle(Context context);


}

/**
 * 具体状态类
 */
class ConcreteStateA extends State {

    @Override
    public void handle(Context context) {
        System.out.println("当前状态是 A.");
        context.setState(new ConcreteStateB());

    }
}

class ConcreteStateB extends State {

    @Override
    public void handle(Context context) {
        System.out.println("当前状态是 B.");
        context.setState(new ConcreteStateA());
    }
}


/**
 * 环境类
 */
class Context {


    private State state;

    public Context() {
        this.state = new ConcreteStateA();
    }


    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }

    public void handle() {

        state.handle(this);
    }


}


class Client {


    public static void main(String[] args) {
        Context context = new Context(); //创建环境
        context.handle(); //处理请求
        context.handle();
        context.handle();
        context.handle();


    }


}

















